package com.cskaoyan.javase.oop1._13block._2building;
/**
 * 一些使用构造代码块需要注意的地方：
 * 1.建议应该将构造代码块，放在成员变量的声明和显式赋值语句的下面：
 *      一方面，如果构造代码块赋值在上，成员变量声明在下，逻辑上会很奇怪。
 *      另一方面，如果对象中成员变量的赋值，依赖于构造代码块和显式赋值的代码书写顺序，容易引发错误。
 *
 *      当然如果你是为了出题，本身就存在为难的意味，不在此限制内。正常写代码不这么做即可！
 *
 * 2.因为构造代码块最终会加入构造器，所以构造代码块当中也可以使用this关键字，指向当前对象。
 * 但是实际使用价值和意义不大，仅作了解。
 *
 * 思考:
 *      1.在构造代码块中,能不能给静态成员变量赋值?可不可以?做不做得到?
 *          很明显是可以的
 *          构造代码块在创建对象过程中执行,所以类加载已经完成了,静态成员变量已经存在了
 *          肯定是可以给静态成员变量赋值的
 *
 *          当然这种给静态成员变量赋值的方式,依赖于创建对象,一般不会使用.
 *
 *
 * @since 10:53
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        // 构造代码块需要new对象,创建对象时执行,以下代码只会触发类加载,没有创建对象
        // 于是num = 100的构造代码赋值,没有执行,结果仍然是默认值0
        System.out.println(Teacher.num);
        new Teacher();
        // 上面new对象了,构造代码块执行了,num=100
        System.out.println(Teacher.num);

    }

}
class Teacher{
    static int num;
    // 构造代码块不建议这么写
    {
        age = 10;
        // test();
        num = 100;
    }
    int age = 10;

    public void test(){}

}
